﻿using Entity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IRepository
{
    public interface INumberingRuleRepository
    {
        // 根据目标表单名称获取规则（核心新增方法）
        NumberingRule GetByTargetFormName(string targetFormName);

        // 根据目标表单和编号前缀，获取当前最大流水号
        int GetMaxSerialNumber(string targetForm, string number_prefix);

        // 更新流水号（按步长递增）
        int UpdateSerialNumber(string targetForm, string number_prefix, int newSerialNumber);

        // 多条件查询
        PaginationResult<NumberingRule> GetByConditions(NumberingRuleQueryParams queryParams);

        // 根据ID获取规则
        NumberingRule GetById(int rule_id);

        // 保存规则（新增/更新）
        int SaveRule(NumberingRule rule);

        List<NumberingRule> GetByIds(List<int> ids);

        // 带锁查询规则，防止并发问题
        NumberingRule GetRuleWithLock(int rule_id, IDbTransaction transaction = null);

        // 更新最大值和时间
        bool UpdateMaxValueAndTime(int rule_id, int newMaxValue, DateTime last_generation_time, string @operator, IDbTransaction transaction = null);

        NumberingRule GetByTargetAndPrefix(int target_id, string number_prefix);

        /// <returns>新增的编号规则ID</returns>
        int AddTargetAndRule(TargetForm targetForm, NumberingRule numberingRule);

        // 删除编号规则（逻辑删除）
        bool DeleteRule(int rule_id, string currentUser);

        // 获取数据库连接（供缓存刷新使用）
        IDbConnection GetDbConnection();
        NumberingRule GetByTargetId(int targetId);
    }
}
